/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#include "GainController.h"

#include "Utils.h"
#include <sstream>

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

using namespace std;
using namespace SimInterface;

const std::string GainController::CONF_GAIN = "gain";

GainController::GainController(SimInterface::ISimulator &isim, double gain)
    : ControllerBase(isim, "P", "GainController"),
      m_gain(gain)
{
}

double GainController::simulateControllerStep(double setPoint, double processVar)
{
    return Utils::limitValue(m_gain * (setPoint - processVar), 0.0, 1.0);
}


//
// Sprawy konfiguracyjne
//

bool GainController::setParameter(const std::string& param, const std::string& value) throw(std::logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string tvalue = Utils::trimWhiteSpaces(value);

    // Strumień danych dla łańcucha argumentu.
    istringstream istr(tvalue);

    double tmpVal;
    istr >> tmpVal;

    if(tparam == CONF_GAIN)
    {
        if(!istr.bad())
        {
            m_gain = tmpVal;
        }
    }
    else
        throw iconf_error::unrecognizedParam(*this, tparam);

    if(istr.bad())
        throw iconf_error::syntaxError(*this, tvalue);

    return true;
}

std::string GainController::getParameter(const std::string& param) const throw(std::logic_error)
{
    // Usuń ewentualne wiodące i końcowe spacje
    string tparam = Utils::trimWhiteSpaces(param);
    string outStr;

    // Strumień danych dla łańcucha argumentu.
    ostringstream ostr(outStr);

    if(tparam == CONF_GAIN)
    {
        ostr << m_gain;
    }
    else
        return ControllerBase::getParameter(tparam);

    return ostr.str();
}

SimFile::ConfigWriter& GainController::dumpSpecificPar(SimFile::ConfigWriter& o) const
{
    o.pushLineComment("Regulator proporcjonalny");
    o.pushParam(CONF_GAIN, m_gain);
    o.pushLineComment("Wzmocnienie regulatora");
    return o;
}

}
}
